3

前言

一直以来,PHP 因为标准应用方式是配合 php-fpm 或 apache mod 使用,而被认为不适合做服务化后端。但是随着 Workerman 和 Swoole 这些常驻进程模块的出现,PHP 其实早就已经合格。

下面我就介绍如何用 PHP 来搭建一个高性能的服务化后端框架,并且实现一个客户端调用例子。

服务端

现在 PHP 圈子里最流行的框架是 Laravel, Lumen 是它的精简版,保留了 Container(依赖注入), artisan(命令行生成数据表)等优点。

服务端我使用的框架叫 Luke,Github 地址在这里。Luke 是 Lumen 的非官方分支,在 Lumen 上层做了一层封装,剥离了用于 http 的路由,同时引入 Workerman。

现在在你的工作目录执行下面命令生成项目代码

composer create-project luke/luke=dev-luke rpcserver
cd rpcserver

这时在 servers 目录下有 http.php 和 jsonrpc.php 两个文件,分别对应 http 服务 和 jsonrpc 服务。现在我们进入 rpcserver/app/Http/Controllers,编辑文件 ExampleController.php,增加下面代码

public function show($name)
{
    return "Hello $name, this is Luke.";
}

这样我们服务端就已经搭建好了,现在回到 rpcserver 目录,执行下面命令开启服务

php servers/jsonrpc.php start

这时 console 会输出

Workerman[servers/jsonrpc.php] start in DEBUG mode
----------------------- WORKERMAN -----------------------------
Workerman version:3.5.4          PHP version:7.2.1
------------------------ WORKERS -------------------------------
user          worker        listen                 processes status
simon         none          jsonNL://0.0.0.0:8000   1         [OK] 
----------------------------------------------------------------

表示服务正在正常运行。

本例子只给 Workerman 一个任务进程,更多设置和守护进程方式可以查看 Workerman文档

客户端

现在我们回到项目根目录,另开一个 console,输入下面命令新建客户端目录,引入模块

mkdir client
cd client
composer require luke/client

这时 vendor/luke/client 目录下已经有了两个文件 config.php 和 test.php,他们分别是配置和客户端的例子。我们不管他们,在项目目录下新建 test.php 文件,输入下面的代码并保存

<?php
require 'vendor/autoload.php';
use Luke\Client;

$config = [
    'default' => [
        'hosts' => ['127.0.0.1:8000']
    ]
];

Client::config($config);
$client = Client::instance("Example");
$ret = $client->show('开发者');
var_dump($ret);

现在执行

php test.php

如果看到输出

array(1) {
  'result' =>
  string(30) "Hello 开发者, this is Luke."
}

那么恭喜你!你的 rpc 服务端和客户端已经搭建好了。现在将它应用到正式项目中吧。

Workerman 与 Swoole

作为 PHP 的常驻方案,两个都非常优秀,而 Swoole 在社区的活跃度比 Workerman 高。但因为两者性能不分伯仲,而且 Workerman 是用纯 PHP 开发,代码更为可控,因此 Luke 选择了 Workerman。然而两者在调用方式非常接近,只要对代码稍加修改就能改成使用 Swoole。

Workerman 的并发性能可以参考这里

后记

在生产环境使用服务化架构,通信部分除了协议外,还要注意加密。这部分 Luke 现在还没有提供,用户可以用简单的加密算法自己实现。
当服务变多后,还需要添加自动发现的功能,这点在 Luke Client 的项目主页提供了一些思路。


月球人simon
73 声望6 粉丝

下一篇 »
php异步编程